package com.qtrue.string;

import org.junit.Test;

/**
 * @Package: com.qtrue.string
 * @ClassName: StringMethodTest
 * @Author: xiaoBao
 * @CreateTime: 2022-05-17 16:45
 * @Description:String类中常用的方法
 *
 *  【常用方法一】：
 *  int length()：返回字符串的长度:return value.length
 *  char charAt(int index)：返回某索引处的字符return value[index]
 *  boolean isEmpty()：判断是否是空字符串:return value.length == 0
 *  String toLowerCase()：将String中的所有字符转换为小写
 *  String toUpperCase()：将String中的所有字符转换为大写
 *  String trim()：返回字符串的副本，忽略前导空白和尾部空白
 *  boolean equals(Object obj)：比较字符串的内容是否相同
 *  boolean equalslgnoreCase(String anotherString)：与equals方法类似，忽略大小写
 *  String concat(String str)：将指定字符串连接到此字符串的结尾。等价于用 “+”
 *  int compareTo(String anotherString)：比较两个字符串的大小
 *  String substring(int beginIndex)：返回一个新的字符串，它是此字符串的从beginIndex（开始下标节点）开始截取到最后的一个子字符串。
 *  String substring(int beginIndex, int endIndex)：返回一个新字符串、它是此字符串从beginIndex（开始下标节点）开始截取到endIndex(结束下标节点)的一个子字符串。
 *
 *  【常用方法二】：
 *  boolean endsWith(String suffix)：测试此字符串是否以制定的后缀结束（区分大小写）
 *  boolean startsWith(String suffix)：测试此字符串从指定的前缀开始（区分大小写）
 *  boolean startsWith(String prefix, int toffset)：测试此字符串从指定索引开始的子字符串是否以指定前缀开始（区分大小写）
 *  boolean contains(CharSequence s)：当且仅当此字符串包含指定的char值序列时，返回true（区分大小写）
 *  int indexOf(String str)：返回指定子字符串在此字符串中第一次出现处的索引（区分大小写）
 *  int indexOf(String str, int fromIndex)：返回指定子字符串在此字符串中第一次出现处的索引，从指定的索引开始搜索（区分大小写）
 *  int lastlndexOf(String str)：返回指定子字符串在此字符串中最右边出现处的索引
 *  int lastIndexOf(String str, int fromIndex)：返回指定子字符串在此字符串中最后一次出现处的索引，从指定的索引开始反向搜索（找最左边第一个出现）
 *  注: indexOf和lastIndexOf方法 如果未找到都是返回-1
 *
 *  【常用方法三】：
 *  [替换]：
 *  string replace(char oldChar, char newchar)：返回一个新的字符串，它是通过用newChar替换此字符串中出现的所有oldChar得到的。
 *  string replaceAllString regex, String replacement)：使用给定的replacement替换此字符串所有匹配给定的正则表达式的子字符串。
 *  String replaceFirst(String regex, String replacement)：使用给定的replacement替换此字符串匹配给定的正则表达式的第一个子字符串。
 *  [匹配]：
 *  boolean matches(String regex)：告知此字符串是否匹配给定的正则表达式。
 *  [分割（切片）]：
 *  String[] split(String regex)：根据给定正则表达式的匹配拆分此字符串。
 */
public class StringMethodTest {

    @Test
    public void StringMethodTest01(){
        String s1 = "helloworld";
        // length()：返回字符串的长度
        System.out.println(s1.length()); // 10

        System.out.println("**********************");

        // charAt(int index)：返回指定索引处的字符
        System.out.println(s1.charAt(0)); // h
        System.out.println(s1.charAt(4)); // o
        System.out.println(s1.charAt(9)); // d

        System.out.println("**********************");

        // isEmpty()：判断是否是空字符串
        System.out.println(s1.isEmpty()); // false

        System.out.println("**********************");

        // toUpperCase()：将String中的所有字符转换为大写
        System.out.println(s1.toUpperCase()); // HELLOWORLD
        // toLowerCase()：将String中的所有字符转换为小写
        System.out.println(s1.toLowerCase()); // helloworld

        System.out.println("**********************");

        String s2 = " Ha Ha Ha Ha ";
        // trim()：去掉字符串中首部和尾部的空格，返回字符串的副本
        System.out.println(s2.trim()); //Ha Ha Ha Ha
        // replaceAll()：替换指定字符，返回字符串的副本（当字符串中有多个空格，使用此方法有效去除）
        System.out.println(s2.replaceAll(" ","")); //HaHaHaHa
    }

    @Test
    public void StringMethodTest02(){
        // equalslgnoreCase()：判断字符串是否相等，与equals相似，但忽略大小写。
        String s1 = "HelloWorld";
        String s2 = "helloworld";
        System.out.println(s1.equalsIgnoreCase(s2)); // true
        System.out.println(s1.equals(s2)); // false

        System.out.println("**********************");

        String s3 = "abc";
        // concat()：将指定字符串连接到此字符串的结尾（字符串拼接）
        String s4 = s3.concat("def");
        System.out.println(s4); // abcdef

        System.out.println("**********************");

        String s5 = "abc";
        String s6 = new String("abd");
        String s7 = "abcdefgh";
        // compareTo()：比较两个字符串的大小
        /*
            1. 返回参与比较的前后两个字符串的ASCII码的差值，如果两个字符串首字母不同，则该方法返回首字母的ASCII码的差值。
            2. 参与比较的两个字符串如果首字符相同，则比较下一个字符，直到有不同的为止，返回该不同的字符的ASCII码差值。
            3. 如果两个字符串不一样长，可以参与比较的字符又完全一样，则返回两个字符串的长度差值。
        */
        System.out.println(s5.compareTo(s6)); // -1
        System.out.println(s5.compareTo(s7)); // -5
    }

    @Test
    public void StringMethodTest03(){
        String s1 = "HelloWorld";
        // endsWith(String suffix)：测试此字符串是否以制定的后缀结束（区分大小写）
        boolean b1 = s1.endsWith("rld");
        System.out.println(b1); // true

        System.out.println("**********************");

        // startsWith(String suffix)：测试此字符串从指定的前缀开始（区分大小写）
        boolean b2 = s1.startsWith("He");
        System.out.println(b2); // true

        // startsWith(String prefix, int toffset)：测试此字符串从指定索引开始的子字符串是否以指定前缀开始（区分大小写）
        boolean b3 = s1.startsWith("ll",2);
        System.out.println(b3); // ture

        System.out.println("**********************");

        String s2 = "Wo";
        String s3 = "Wd";
        // contains(CharSequence s)：当且仅当此字符串包含指定的char值序列时，返回truel（区分大小写）
        System.out.println(s1.contains(s2)); // ture
        System.out.println(s1.contains(s3)); // false

        System.out.println("**********************");

        // indexOf(String str)：返回指定子字符串在此字符串中第一次出现处的索引（区分大小写）
        System.out.println(s1.indexOf("o")); // 4
        // indexOf(String str, int fromIndex)：返回指定子字符串在此字符串中第一次出现处的索引，从指定的索引开始搜索（区分大小写）
        System.out.println(s1.indexOf("r",3)); // 7

        System.out.println(s1.indexOf("ol")); // -1（未找到返回-1）

        System.out.println("**********************");

        String s4 = "hellorworld";
        // lastlndexOf(String str)：返回指定子字符串在此字符串中最右边出现处的索引
        System.out.println(s4.lastIndexOf("or")); // 7
        // lastIndexOf(String str, int fromIndex)：返回指定子字符串在此字符串中最后一次出现处的索引，从指定的索引开始反向搜索（找最左边第一个出现）
        System.out.println(s4.lastIndexOf("or",6)); // 4

        System.out.println(s4.lastIndexOf("le")); // -1（未找到返回-1）

        // 在什么情况下indexOf()和lastIndexOf()返回值一样
        // 情况一：只有一个str； 情况二：未找到
    }


    @Test
    public void StringMethodTest04(){
        String s1 = "HelloWorld";
        // replace(char oldChar, char newchar)：返回一个新的字符串，它是通过用newChar替换此字符串中出现的所有oldChar得到的。
        String str1 = s1.replace("H","哈");
        System.out.println(str1); // 哈elloWorld

        System.out.println("**********************");

        // 1、将字符串中的数字替换成“,”    2、如果开头和结尾中有“,” 则去掉
        String s2 = "122Hello74345World963Java";
        // replaceAllString regex, String replacement)：使用给定的replacement替换此字符串所有匹配给定的正则表达式的子字符串。
        String str2 = s2.replaceAll("\\d+", ",").replaceAll("^,|,$", ""); // \\d+ 表示以数字开头
        System.out.println(str2); // Hello.World,Java

        System.out.println("**********************");

        // boolean matches(String regex)：告知此字符串是否匹配给定的正则表达式

        String s3 = "12345678";
        // 判断字符串是否以数字开头
        boolean b1 = s3.matches("\\d+");
        System.out.println(b1); // true

        String tel = "15723889613";
        // 判断电话号码是否以157开头，并且符合电话号码的长度是否为11位数
        boolean b2 = tel.matches("157\\d{8}"); // 157开头，结尾为8位数
        System.out.println(b2); // true

        System.out.println("**********************");

        // String[] split(String regex)：根据给定正则表达式的匹配拆分此字符串。

        String s4 = "Hello|World|Java";
        // 分割所有字符串，并返回一个数组，最后输出每一个元素，以“|”分割。
        String[] strs1 = s4.split("\\|");
        for(int i = 0;i< strs1.length;i++) {
            System.out.println(strs1[i]); // Hello World Java
        }
        System.out.println("-----");
        // 分割所有字符串，并返回一个数组，最后输出每一个元素，以“.”分割。
        String s5 = "Hello.World.Java";
        String[] strs2 = s5.split("\\.");
        for(int i = 0;i< strs2.length;i++) {
            System.out.println(strs2[i]); // Hello World Java
        }
    }

}
